#include<cstdio>
#include<cstring>
#include<algorithm>
#define INF 0x3f3f3f3f
using namespace std;
typedef long long LL;
typedef double db;
inline int read()
{
	int x=0,f=1;
	char ch=getchar();
	while(ch<'0'||ch>'9') { if(ch=='-')f=-1; ch=getchar(); }
	while(ch>='0'&&ch<='9') { x=(x<<1)+(x<<3)+ch-'0'; ch=getchar(); }
	return x*f;
}
const int MAXN=11,MAX=1<<21;
int n,m,a[MAXN][MAXN],b[MAXN][MAXN],mi[MAXN<<1],vis[MAX],f[MAX],g[MAX];
int dfs(int stat,bool flag)
{
	if(stat==(1<<n)-1)return 0;
	if(flag)
	{
		if(vis[stat])return f[stat];
		int t=-INF,x=n,y=1;
		for(int i=n+m;i;--i)
		{
			if(stat&mi[i])
			{
				if(i!=1&&!(stat&mi[i-1]))t=max(t,dfs(stat^mi[i]^mi[i-1],false)+a[x][y]);
				--x;
			}
			else ++y;
		}
		vis[stat]=true;
		return f[stat]=t;
	}
	else
	{
		if(vis[stat])return g[stat];
		int t=INF,x=n,y=1;
		for(int i=n+m;i;--i)
		{
			if(stat&mi[i])
			{
				if(i!=1&&!(stat&mi[i-1]))t=min(t,dfs(stat^mi[i]^mi[i-1],true)-b[x][y]);
				--x;
			}
			else ++y;
		}
		vis[stat]=true;
		return g[stat]=t;
	}
}
int main()
{
	n=read();m=read();
	for(int i=1;i<=n;++i)
		for(int j=1;j<=m;++j)
			a[i][j]=read();
	for(int i=1;i<=n;++i)
		for(int j=1;j<=m;++j)
			b[i][j]=read();
	for(int i=1;i<=n+m;++i)mi[i]=1<<(i-1);
	printf("%d\n",dfs(((1<<n)-1)<<m,true));
	return 0;
}
